﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/*
 * 各类概念总结：
 * 
 *          1、方法重载(overload)：参数个数/类型/顺序不同时 两个方法会构成重载
 *          
 *          2、方法隐藏(hide)：子类继承父类，子类有与父类相同签名的方法，则会隐藏其方法，二者方法并存
 *          
 *          3、方法重写(override)：通过父类类型对象，调用子类对象当中对应方法的实现
 *          
 *              细节：子类当中的override方法会‘抹杀’父类当中的对应virtual方法
 */

namespace 继承中的多态
{
    class Pet
    {
        //方法重载
        public void Eat() { }
        public void Eat(string food) { }

        //方法隐藏
        public void Drink() 
        {
            Console.WriteLine("Pet Drink");
        }

        //方法重写
        virtual public void Shout()
        {
            Console.WriteLine("Pet Shout");
        }
    }
    class Dog : Pet
    {
        //方法隐藏
        new public void Drink() 
        {
            Console.WriteLine("Dog Drink");
        }

        //方法重写
       override public void Shout()
        {
            Console.WriteLine("Dog Shout");
        }
    }
    class Cat : Pet
    {
        override public void Shout()
        {
            Console.WriteLine("Cat Shout");
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            //对方法重载进行演示
            Pet pet = new Pet();
            pet.Eat();
            pet.Eat("狗粮");

            //对方法隐藏进行演示
            Dog dog = new Dog();
            //dog.Drink();

            //使用父类类型的对象，可以承接子类对象的赋值
            //将dog对象对应的内存，看作是一个pet类型对象的内存

            //对方法重载进行演示
            Pet pet2 = dog;
            //pet2.Drink();

            //对方法重写进行演示
            Pet pet3 = dog;
            pet3.Shout();

            Play(dog);

            Cat cat = new Cat();
            Play(cat);

            Console.Read();
        }
        static public void Play(Pet pet)
        {
            pet.Shout();
        }
    }
}
